package com.likeyoudo.common.msg;

import androidx.annotation.NonNull;

import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.blankj.utilcode.util.ToastUtils;
import com.likeyoudo.common.constant.HttpStatus;

import java.util.List;

/**
 * EventBus消息对象
 *
 * @author LikeYouDo
 * @date 2023/12/18 22:44
 */
public class MsgEvent {
    private String msg;

    private String type;

    private String data;

    // private final String childrenColumn = "children";

    /**
     * 状态码
     */
    private final String CODE = "code";

    /**
     * 响应信息
     */
    private final String MSG = "msg";

    /**
     * 数据载荷字段
     */
    private final String DATA = "data";

    /**
     * 表格数据载荷字段
     */
    private final String ROWS = "rows";

    MsgEvent() {
    }

    MsgEvent(MsgEventBuilder builder) {
        this.msg = builder.msg;
        this.type = builder.type;
        this.data = builder.data;
    }

    public static MsgEventBuilder builder() {
        return new MsgEventBuilder();
    }

    /**
     * 通过传入的类序列化data属性的List值
     * (不包含状态码和响应信息)
     * 解析失败返回null
     *
     * @param clazz
     * @param <T>
     * @return
     */
    public <T> List<T> getListData(@NonNull Class<T> clazz) {
        JSONObject jsonObject = JSON.parseObject(data);
        if (jsonObject.containsKey(CODE)) {
            Integer code = jsonObject.getInteger(CODE);
            if (code >= HttpStatus.SUCCESS && code < HttpStatus.MULTIPLE_CHOICES) {
                // 返回信息有效
                // 判断是否存在data的字段,不存在返回null
                if (jsonObject.containsKey(DATA)) {
                    // 只抽取数据载荷字段的数据
                    return jsonObject.getList(DATA, clazz);
                } else if (jsonObject.containsKey(ROWS)) {
                    // 只抽取数据载荷字段的数据
                    return jsonObject.getList(ROWS, clazz);
                }
            }
        } else {
            ToastUtils.showShort(jsonObject.getString(MSG));
        }
        return null;
    }

    /**
     * 通过传入的类序列化data属性的对象值
     * (不包含状态码和响应信息)
     * 解析失败返回null
     *
     * @param clazz
     * @param <T>
     * @return
     */
    public <T> T getData(@NonNull Class<T> clazz) {
        JSONObject jsonObject = JSON.parseObject(data);
        if (jsonObject.containsKey(CODE)) {
            Integer code = jsonObject.getInteger(CODE);
            if (code >= HttpStatus.SUCCESS && code < HttpStatus.MULTIPLE_CHOICES) {
                // 返回信息有效
                // 判断是否存在data的字段,不存在返回null
                if (jsonObject.containsKey(DATA)) {
                    // 只抽取数据载荷字段的数据
                    return jsonObject.getObject(DATA, clazz);
                }
            }
        } else {
            ToastUtils.showShort(jsonObject.getString(MSG));
        }
        return null;
    }

    /**
     * 传入Response类直接返回该类对象(包含状态码和响应信息)
     *
     * @param clazz
     * @param <T>
     * @return
     */
    public <T> T getResponse(@NonNull Class<T> clazz) {
        return JSON.parseObject(this.data, clazz);
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public String getData() {
        return data;
    }

    public void setData(String data) {
        this.data = data;
    }
}
